package com.eianiao.web;
import com.eianiao.common.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/*
    用来处理文件上传和下载
 */
@RestController
@RequestMapping("/common")
public class CommonController {

    @Value("${uploadPath}")
    private String uploadPath;  //   D:/java/file


    /**
     * 处理文件上传
     * @param file  参数名一定不能乱写，需要和上传的页面标签的name属性值一样，默认这个name的属性值是 file
     * @return
     */
    @PostMapping("/upload")
    public R upload(MultipartFile file) throws IOException {
        //把文件给保存起来： 非常简单的版本；
        //file.transferTo(new File("D:/aa.jpg"));

        //标准的版本：

        //1. 获取文件的原始名字：  aa.jpg
        String oldName = file.getOriginalFilename();

        //2. 构建出来新的文件名字，这个名字必须确保唯一性...  UUID +  .jpg
        //2.1 构建唯一名字  a546d82bd90449bdbce98bf8d1cf98b8
        String uuid = UUID.randomUUID().toString().replace("-","");

        //2.2 组拼后缀名，形成新的文件名称  .jpg
        String suffix = oldName.substring(oldName.lastIndexOf("."));

        //2.3 构建新的名称
        String newName = uuid +  suffix;

        //3. 指定一个保存的位置
        //3.1 构建一个保存的目录位置
        File directory  = new File(uploadPath);
        if(!directory.exists()){
            directory.mkdirs();
        }

        //4. 保存文件到上面指定的位置！
        File targetFile = new File(directory ,newName);
        file.transferTo(targetFile);

        //5. 返回该文件的名字【包括后缀名】
        return R.success(newName);
    }


    /**
     * 根据文件名称来下载文件
     * @param name
     */
    @GetMapping("/download")
    public void download(String  name , HttpServletResponse resp) throws IOException {

        //0. 找到指定的文件
        File file = new File(uploadPath ,name );

        //1. 根据指定的文件构建一个输入流
        FileInputStream fis = new FileInputStream(file );

        //2. 定义一个缓冲区，把输入流不断的读取到缓冲区
        byte []buffer = new byte[1024];
        int len = 0 ;
        while( (len = fis.read(buffer)) != -1 ) {

            //3. 把缓冲区的内容，不断的写给页面。
            resp.getOutputStream().write(buffer , 0 , len);
        }

        fis.close();
    }

}
